<!DOCTYPE html> <html><!--
 Archive processed by SingleFile 
 url: https://mp.weixin.qq.com/s?__biz=MzIwMTg3NzYyOA==&mid=2247484076&idx=1&sn=2ee3d3083e312399aec2da55c044d48c&chksm=96e673bfa191faa963222ee834e3067548c20a114fa5e5dac21a016dbab9184985c995c0c71f&token=1598376740&lang=zh_CN#rd 
 saved date: Tue Nov 26 2019 10:22:15 GMT+0800 (中国标准时间) 
--><meta charset=utf-8>
<meta http-equiv=X-UA-Compatible content="IE=edge">
<meta name=viewport content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover">
<meta name=apple-mobile-web-app-capable content=yes>
<meta name=apple-mobile-web-app-status-bar-style content=black>
<meta name=format-detection content="telephone=no">
<meta name=description content=Java面试集锦：25道线程类相关面试题与答案（一）>
<meta name=author content=Coder编程>
<meta property=og:title content=Java面试集锦：25道线程类相关面试题与答案（一）>
<meta property=og:url content="http://mp.weixin.qq.com/s?__biz=MzIwMTg3NzYyOA==&amp;mid=2247484076&amp;idx=1&amp;sn=2ee3d3083e312399aec2da55c044d48c&amp;chksm=96e673bfa191faa963222ee834e3067548c20a114fa5e5dac21a016dbab9184985c995c0c71f#rd">
<meta property=og:image content="http://mmbiz.qpic.cn/mmbiz_jpg/dCCj1byj80uk6yVpKe1vhyMGKf3Vw53W5Okp8Kt8iau5nPRiaP4t3xRWkp6ibUaYL6iavXQdnQ6vPUVibyO5PJoulag/0?wx_fmt=jpeg">
<meta property=og:description content=Java面试集锦：25道线程类相关面试题与答案（一）>
<meta property=og:site_name content=微信公众平台>
<meta property=og:type content=article>
<meta property=og:article:author content=Coder编程>
<meta property=twitter:card content=summary>
<meta property=twitter:image content="http://mmbiz.qpic.cn/mmbiz_jpg/dCCj1byj80uk6yVpKe1vhyMGKf3Vw53W5Okp8Kt8iau5nPRiaP4t3xRWkp6ibUaYL6iavXQdnQ6vPUVibyO5PJoulag/0?wx_fmt=jpeg">
<meta property=twitter:title content=Java面试集锦：25道线程类相关面试题与答案（一）>
<meta property=twitter:creator content=Coder编程>
<meta property=twitter:site content=微信公众平台>
<meta property=twitter:description content=Java面试集锦：25道线程类相关面试题与答案（一）>
<title>Java面试集锦：25道线程类相关面试题与答案（一）</title>
<style media>.rich_media_inner{overflow-wrap:break-word;hyphens:auto}.rich_media_area_primary{padding:calc(20px + env(safe-area-inset-top)) calc(16px + env(safe-area-inset-right)) 12px calc(16px + env(safe-area-inset-left))}.rich_media_area_extra{padding:0 calc(16px + env(safe-area-inset-right)) calc(16px + env(safe-area-inset-bottom)) calc(16px + env(safe-area-inset-left))}html{line-height:1.6}body{color:#333;background-color:#f2f2f2;letter-spacing:.034em}h2{font-weight:400}*{margin:0;padding:0}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}.rich_media_title{font-size:22px;line-height:1.4;margin-bottom:14px}@supports(-webkit-overflow-scrolling:touch){.rich_media_title{font-weight:700}}.rich_media_meta_list{margin-bottom:22px;line-height:20px;font-size:0;overflow-wrap:break-word;word-break:break-all}.rich_media_meta_list em{font-style:normal}.rich_media_meta{display:inline-block;vertical-align:middle;margin:0 10px 10px 0;font-size:15px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rich_media_meta_text{color:rgba(0,0,0,0.3)}.rich_media_meta_nickname{position:relative}.rich_media_content{overflow:hidden;color:#333;font-size:17px;overflow-wrap:break-word;hyphens:auto;text-align:justify;z-index:0}.rich_media_content *{max-width:100% !important;box-sizing:border-box !important;overflow-wrap:break-word !important}.rich_media_content p{clear:both;min-height:1em}.rich_media_content .list-paddingleft-2{padding-left:2.2em}@media screen and (min-width:1024px){.rich_media_area_primary_inner,.rich_media_area_extra_inner{max-width:677px;margin-left:auto;margin-right:auto}.rich_media_area_primary{padding-top:32px}}blockquote{padding-left:10px;border-left:3px solid #dbdbdb;padding-top:4px;margin:1em 0}.appmsg_skin_default .rich_media_area_primary{background-color:#fff}.appmsg_style_default .rich_media_tool{padding-top:15px}.read-more__area{margin:30px 0}html,body{height:100%}</style>
<!--[if lt IE 9]>
<link rel="stylesheet" type="text/css" href="//res.wx.qq.com/mmbizwap/zh_CN/htmledition/style/page/appmsg_new/pc492bcc.css">
<![endif]-->
<style id=page/appmsg_new/not_in_mm.css>.weui-flex{display:flex}.weui-flex__item{-webkit-box-flex:1;flex:1 1 0%}html{text-size-adjust:100%}body{line-height:1.6;font-family:-apple-system-font,BlinkMacSystemFont,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei UI","Microsoft YaHei",Arial,sans-serif;font-size:16px}body,h2,h3,p,ul{margin:0}a{color:#576b95;text-decoration:none}body,html{-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}@media(orientation:portrait){@-webkit-keyframes opr_fade_out{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes opr_fade_in{0%{opacity:0}100%{bottom:0;opacity:1}}}@-webkit-keyframes opr_fade_out{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes opr_fade_in{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes opacity-60-25-0-12{0%{opacity:.25}0.01%{opacity:.25}0.02%{opacity:1}60.01%{opacity:.25}100%{opacity:.25}}@-webkit-keyframes opacity-60-25-1-12{0%{opacity:.25}8.34333%{opacity:.25}8.35333%{opacity:1}68.3433%{opacity:.25}100%{opacity:.25}}@-webkit-keyframes opacity-60-25-2-12{0%{opacity:.25}16.6767%{opacity:.25}16.6867%{opacity:1}76.6767%{opacity:.25}100%{opacity:.25}}@-webkit-keyframes opacity-60-25-3-12{0%{opacity:.25}25.01%{opacity:.25}25.02%{opacity:1}85.01%{opacity:.25}100%{opacity:.25}}@-webkit-keyframes opacity-60-25-4-12{0%{opacity:.25}33.3433%{opacity:.25}33.3533%{opacity:1}93.3433%{opacity:.25}100%{opacity:.25}}@-webkit-keyframes opacity-60-25-5-12{0%{opacity:.270958}41.6767%{opacity:.25}41.6867%{opacity:1}1.67667%{opacity:.25}100%{opacity:.270958}}@-webkit-keyframes opacity-60-25-6-12{0%{opacity:.375125}50.01%{opacity:.25}50.02%{opacity:1}10.01%{opacity:.25}100%{opacity:.375125}}@-webkit-keyframes opacity-60-25-7-12{0%{opacity:.479292}58.3433%{opacity:.25}58.3533%{opacity:1}18.3433%{opacity:.25}100%{opacity:.479292}}@-webkit-keyframes opacity-60-25-8-12{0%{opacity:.583458}66.6767%{opacity:.25}66.6867%{opacity:1}26.6767%{opacity:.25}100%{opacity:.583458}}@-webkit-keyframes opacity-60-25-9-12{0%{opacity:.687625}75.01%{opacity:.25}75.02%{opacity:1}35.01%{opacity:.25}100%{opacity:.687625}}@-webkit-keyframes opacity-60-25-10-12{0%{opacity:.791792}83.3433%{opacity:.25}83.3533%{opacity:1}43.3433%{opacity:.25}100%{opacity:.791792}}@-webkit-keyframes opacity-60-25-11-12{0%{opacity:.895958}91.6767%{opacity:.25}91.6867%{opacity:1}51.6767%{opacity:.25}100%{opacity:.895958}}@-webkit-keyframes loading{0%{transform:rotate3d(0,0,1,0)}100%{transform:rotate3d(0,0,1,360deg)}}@keyframes loading{0%{transform:rotate3d(0,0,1,0)}100%{transform:rotate3d(0,0,1,360deg)}}.article_extend_area{padding:30px 0 0}.article_extend_area:empty{display:none}@supports(-webkit-overflow-scrolling:touch){.reward_button{font-weight:700}}.rich_media_extra{position:relative}.top_banner{background-color:#fff}.ct_mpda_wrp{margin:38px 0 20px}.like_btn{-webkit-appearance:none;-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0;background-color:transparent;border:0;display:inline-block;vertical-align:middle;padding:0;font-size:15px;font-family:inherit;line-height:2.13333;color:#576b95}.like_btn::before{font-size:16px;content:"";display:inline-block;width:1em;height:1.125em;vertical-align:middle;margin-top:-0.25em;margin-right:.05em;background:url("data:image/svg+xml;charset=utf8, %3Csvg width='18' height='20' viewBox='0 0 18 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.485 3.785l2.506-2.477a1.674 1.674 0 0 1 2.352 0l2.505 2.477 3.423.908a1.653 1.653 0 0 1 1.18 2.026l-.917 3.382.918 3.384a1.652 1.652 0 0 1-1.18 2.024l-3.399.902-2.53 2.493a1.674 1.674 0 0 1-2.352 0l-2.506-2.477-3.423-.908a1.653 1.653 0 0 1-1.18-2.026l.917-3.383-.918-3.392a1.652 1.652 0 0 1 1.18-2.025l3.424-.908zm.836 1.447l.006 2.298c0 .59-.317 1.138-.828 1.438l-2.015 1.143 2.005 1.136c.517.29.838.841.838 1.435l-.006 2.298 2.01-1.156a1.667 1.667 0 0 1 1.675-.003l2.007 1.154-.007-2.302c0-.583.319-1.13.829-1.43l2.014-1.142-2.005-1.136a1.647 1.647 0 0 1-.838-1.435l.007-2.298-2.01 1.156a1.65 1.65 0 0 1-1.67.001L6.321 5.232zm-1.094 2.3L5.22 4.994l-2.878.763a.552.552 0 0 0-.398.674l.77 2.851 2.23-1.264a.573.573 0 0 0 .283-.486zm-.278 4.673L2.714 10.94l-.77 2.84a.553.553 0 0 0 .399.676l2.877.763.007-2.537a.548.548 0 0 0-.278-.476zm3.935 2.57l-2.216 1.274 2.096 2.073c.222.22.583.22.806 0l2.103-2.073-2.214-1.274a.57.57 0 0 0-.575 0zm4.222-2.104l.007 2.538 2.879-.763a.552.552 0 0 0 .398-.674l-.771-2.843-2.23 1.265a.57.57 0 0 0-.283.477zm.279-4.664l2.234 1.266.77-2.84a.553.553 0 0 0-.399-.676l-2.877-.763-.007 2.537c0 .196.107.38.279.476zm-4.501-2.57c.176.104.39.104.566 0l2.215-1.274L9.57 2.09a.574.574 0 0 0-.805 0L6.668 4.163l2.216 1.274z' fill='%23576B95' fill-rule='evenodd'/%3E%3C/svg%3E") 0 0 / 1em no-repeat transparent}.like_num{font-size:15px;margin-left:.2em}.like_comment_wrp{font-size:17px;margin-top:9px;margin-bottom:8px;position:relative;z-index:1}.like_comment_wrp::before,.like_comment_wrp::after{content:"";display:inline-block;width:0;height:0;border-width:0 7px 7px;border-style:dashed dashed solid;border-color:transparent transparent rgba(0,0,0,0.03);position:absolute;top:-7px;right:28px}.like_comment_wrp::after{border-bottom-color:#f7f7f7;top:-6px}.like_comment_inner{background-color:rgba(0,0,0,0.03);border-radius:4px;overflow:hidden;padding:24px 16px;display:flex;-webkit-box-align:center;align-items:center;text-align:center}.like_comment_primary_wrp{font-size:16px;margin-top:9px;margin-bottom:4px;background-color:#fff;z-index:21}.like_comment_primary_wrp::before,.like_comment_primary_wrp::after{content:"";display:inline-block;width:0;height:0;border-width:0 7px 7px;border-style:dashed dashed solid;border-color:transparent transparent #fff;position:absolute;top:-7px;right:28px}.like_comment_primary_wrp::after{border-bottom-color:#fff;top:-6px}.like_comment_primary_wrp.editing{position:fixed;top:10px;bottom:0;left:0;right:0;margin:0}.like_comment_primary_wrp.editing::before,.like_comment_primary_wrp.editing::after{display:none}.like_comment_primary_mask{position:fixed;z-index:20;top:0;left:0;bottom:0;right:0;background-color:rgba(0,0,0,0.2)}@-webkit-keyframes weuiLoading{0%{transform:rotate3d(0,0,1,0)}100%{transform:rotate3d(0,0,1,360deg)}}@keyframes weuiLoading{0%{transform:rotate3d(0,0,1,0)}100%{transform:rotate3d(0,0,1,360deg)}}@-webkit-keyframes slidein{0%{transform:translateX(-50%)}100%{transform:translateX(0)}}@keyframes slidein{0%{transform:translateX(-50%)}100%{transform:translateX(0)}}.mpda_bottom_container{position:relative}.rich_media_tool{overflow:hidden;line-height:32px}.rich_media_tool .meta_primary{float:left}.rich_media_tool .meta_extra{float:right}.rich_media_tool .meta_praise{text-align:right}.media_tool_meta i{vertical-align:0;position:relative;top:1px}.meta_praise{-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0}.meta_praise .praise_num{display:inline-block;vertical-align:top}.meta_praise:hover{cursor:pointer}.icon_praise_gray{background:url("") 0 0 / 100% no-repeat transparent;display:inline-block}.rich_media_tool{font-size:15px}.rich_media_tool .meta_primary{margin-right:16px}.rich_media_tool .meta_extra{margin-left:16px;color:#576b95}.rich_media_tool .meta_praise{min-width:2.5em}.rich_media_tool .meta_praise i{margin-right:5px}.icon_praise_gray{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg width='16' height='16' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.5 6.988h-.003c-.095-.01-.167-.022-.125-.022H1.75c-.343 0-.75.39-.75.7v6.73c0 .31.27.57.611.57H2.5V7.01a.51.51 0 0 1 0-.022zm1 .003a.55.55 0 0 1 0 .02v7.955h7.414c.748 0 1.395-.361 1.773-1.324a37.17 37.17 0 0 0 1.115-2.57c.219-.564.413-1.11.575-1.627.247-.785.413-1.48.484-2.058.073-.595-.565-1.021-1.236-1.021h-4.97l.102-.586.18-1.027.13-.55a35.058 35.058 0 0 0 .245-1.128c.212-1.098-.483-2.019-1.238-2.067-.74-.048-1.1.111-1.104.562-.008 1.276-.45 2.805-1.252 4.129-.357.589-.899.965-1.56 1.16-.217.065-.438.107-.658.132zm6.345-1.625h3.78c1.19 0 2.393.804 2.229 2.143-.08.646-.26 1.397-.523 2.235-.17.54-.37 1.107-.597 1.69a38.158 38.158 0 0 1-1.133 2.61c-.525 1.346-1.557 1.922-2.687 1.922H1.61c-.886 0-1.611-.698-1.611-1.57v-6.73c0-.871.864-1.7 1.75-1.7l.719.009A3.285 3.285 0 0 0 3.876 5.9c.435-.13.769-.361.986-.72.71-1.171 1.102-2.525 1.108-3.618C5.978.338 6.901-.07 8.14.01c1.36.088 2.48 1.57 2.155 3.255a36.012 36.012 0 0 1-.253 1.167l-.124.52-.072.414z' fill='%23576B95' fill-rule='nonzero'/%3E%3C/svg%3E");font-size:16px;width:1em;height:1em;background-size:1em}.praise_num{color:#576b95}a,button{cursor:pointer}.rich_media_extra{overflow:hidden}.rich_media_extra_discuss{padding-top:0}.praise_num:empty{margin-left:-3px}.comment_primary_emotion_panel_wrp{position:absolute;z-index:1;padding-top:8px;padding-bottom:16px}.comment_primary_emotion_panel{background:#fff;box-shadow:rgba(0,0,0,0.16) 0 2px 8px 0;border-radius:4px;width:376px;height:216px;overflow-y:auto}.tips_global_primary{color:rgba(0,0,0,0.3)}.weui-dialog{position:fixed;z-index:5000;top:50%;left:16px;right:16px;transform:translate(0,-50%);background-color:#fff;text-align:center;border-radius:12px;overflow:hidden;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;max-height:90%}@media screen and (min-width:352px){.weui-dialog{width:320px;margin:0 auto}}.weui-toast{position:fixed;z-index:5000;width:120px;height:120px;top:40%;left:50%;transform:translate(-50%,-50%);background:rgba(17,17,17,0.7);text-align:center;border-radius:5px;color:#fff;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center}.weui-mask{position:fixed;z-index:1000;top:0;right:0;left:0;bottom:0;background:rgba(0,0,0,0.6)}.weui-mask_transparent{position:fixed;z-index:1000;top:0;right:0;left:0;bottom:0}@-webkit-keyframes weuiLoading{0%{transform:rotate3d(0,0,1,0)}100%{transform:rotate3d(0,0,1,360deg)}}@keyframes weuiLoading{0%{transform:rotate3d(0,0,1,0)}100%{transform:rotate3d(0,0,1,360deg)}}@media screen and (max-width:1023px){.profile_container{display:none !important}}.weui-desktop-popover{white-space:normal;overflow-wrap:break-word;hyphens:auto;z-index:500;color:#353535;line-height:1.6;background:#fff;border-radius:2px}.weui-desktop-popover::before{content:" ";width:8px;height:8px;background-color:#fff;box-shadow:#d4d4d4 0 2px 10px 0;transform:matrix(0.71,0.71,-0.71,0.71,0,0);position:absolute}.weui-desktop-popover::after{content:" ";background-color:#fff;position:absolute}.weui-desktop-popover_img-text{text-align:center}.weui-desktop-popover_pos-up-center{margin-top:16px}.weui-desktop-popover_pos-up-left::before,.weui-desktop-popover_pos-up-center::before,.weui-desktop-popover_pos-up-right::before{top:-4px}.weui-desktop-popover_pos-up-left::after,.weui-desktop-popover_pos-up-center::after,.weui-desktop-popover_pos-up-right::after{height:10px;top:0;left:0;right:0}.weui-desktop-popover_pos-up-center::before,.weui-desktop-popover_pos-down-center::before{margin-left:-4px}.weui-desktop-popover{position:absolute;padding:14px;box-shadow:none;border:1px solid #d9dadc;width:182px;box-sizing:border-box}.weui-desktop-popover::before{box-shadow:none;border:1px solid #d9dadc}.not_in_mm .rich_media_meta_list{position:relative;z-index:1}.not_in_mm .rich_media_content{position:relative}.not_in_mm .profile_container{width:535px;position:absolute;top:100%;left:0;margin-top:10px;font-size:14px}.not_in_mm .profile_inner{position:relative;padding:30px 22px 36px 144px;background-color:#fff;border:1px solid #d9dadc}.not_in_mm .profile_arrow_wrp{position:absolute;left:22px;top:-8px}.not_in_mm .rich_media_inner{position:relative}.not_in_mm .qr_code_pc_outer{position:fixed;left:0;right:0;top:20px;color:#717375;text-align:center;display:none !important}.not_in_mm .qr_code_pc_inner{position:relative;width:740px;margin-left:auto;margin-right:auto}.not_in_mm .qr_code_pc{position:absolute;right:-140px;top:0;width:140px;padding:16px;border:1px solid #d9dadc;background-color:#fff;overflow-wrap:break-word;word-break:break-all}.not_in_mm .qr_code_pc p{font-size:14px;line-height:20px}.not_in_mm .qr_code_pc_img{width:102px;height:102px}@media screen and (min-width:1024px){.not_in_mm .qr_code_pc_outer{top:32px;display:block !important}}.not_in_mm .qr_code_pc{box-sizing:border-box}</style><link rel="shortcut icon" type=image/x-icon href=""></head>
 <body id=activity-detail class="zh_CN mm_appmsg appmsg_skin_default appmsg_style_default not_in_mm">
 
 
 
<div id=js_article class=rich_media>
 
 <div id=js_top_ad_area class=top_banner></div>
 
 <div class=rich_media_inner>
 
 
 <div id=page-content class=rich_media_area_primary>
 <div class=rich_media_area_primary_inner>
 
 
 
 <div id=img-content>
 
 <h2 class=rich_media_title id=activity-name>
 
 
 
 Java面试集锦：25道线程类相关面试题与答案（一）
 </h2>
 <div id=meta_content class=rich_media_meta_list>
 <span class="rich_media_meta rich_media_meta_text">
 Coder编程
 </span>
 
 <span class="rich_media_meta rich_media_meta_nickname" id=profileBt>
 <a href="https://mp.weixin.qq.com/s?__biz=MzIwMTg3NzYyOA==&amp;mid=2247484076&amp;idx=1&amp;sn=2ee3d3083e312399aec2da55c044d48c&amp;chksm=96e673bfa191faa963222ee834e3067548c20a114fa5e5dac21a016dbab9184985c995c0c71f&amp;token=1598376740&amp;lang=zh_CN" id=js_name>
 Coder编程 </a>
 <div id=js_profile_qrcode class=profile_container style=display:none>
 <div class=profile_inner>
 
 
 
 
 
 </div>
 <span class=profile_arrow_wrp id=js_profile_arrow_wrp>
 
 
 </span>
 </div>
 </span>
 <em id=publish_time class="rich_media_meta rich_media_meta_text">1周前</em>
 </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 <div class=rich_media_content id=js_content>
 
 
 
 
 <section style='font-size:15px;color:#3e3e3e;line-height:1.8;word-spacing:2px;letter-spacing:2px;font-family:"Helvetica Neue",Helvetica,"Hiragino Sans GB","Microsoft YaHei",Arial,sans-serif;background-image:linear-gradient(90deg,rgba(50,0,0,0.05) 3%,rgba(0,0,0,0) 3%),linear-gradient(360deg,rgba(50,0,0,0.05) 3%,rgba(0,0,0,0) 3%);background-size:20px 20px;background-position:center center'><section mpa-from-tpl=t data-mpa-powered-by=yiban.io style='color:#3e3e3e;font-size:15px;white-space:normal;word-spacing:2px;font-family:-apple-system-font,BlinkMacSystemFont,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei UI","Microsoft YaHei",Arial,sans-serif;letter-spacing:.544px;background-color:#ffffff;box-sizing:border-box !important;overflow-wrap:break-word !important'><section data-mpa-template=t mpa-paragraph-type=ignored mpa-from-tpl=t style='font-family:-apple-system-font,system-ui,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei UI","Microsoft YaHei",Arial,sans-serif;letter-spacing:.544px;box-sizing:border-box !important;overflow-wrap:break-word !important'><p style="min-height:1em;font-size:16px;text-align:center;box-sizing:border-box !important;overflow-wrap:break-word !important"><span style='letter-spacing:.544px;color:#7f7f7f;font-family:-apple-system-font,BlinkMacSystemFont,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei UI","Microsoft YaHei",Arial,sans-serif;font-size:14px;line-height:1.75em;box-sizing:border-box !important;overflow-wrap:break-word !important'>点击上方“</span><span style='letter-spacing:.544px;font-family:-apple-system-font,BlinkMacSystemFont,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei UI","Microsoft YaHei",Arial,sans-serif;font-size:14px;line-height:1.75em;box-sizing:border-box !important;overflow-wrap:break-word !important'><span style="color:#00b0f0;box-sizing:border-box !important;overflow-wrap:break-word !important">Coder编程</span></span><span style='letter-spacing:.544px;color:#7f7f7f;font-family:-apple-system-font,BlinkMacSystemFont,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei UI","Microsoft YaHei",Arial,sans-serif;font-size:14px;line-height:1.75em;box-sizing:border-box !important;overflow-wrap:break-word !important'>”，选择“置顶公众号”</span><br style="box-sizing:border-box !important;overflow-wrap:break-word !important"></p></section></section><section powered-by=xiumi.us style='color:#3e3e3e;font-size:15px;white-space:normal;word-spacing:2px;font-family:-apple-system-font,BlinkMacSystemFont,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei UI","Microsoft YaHei",Arial,sans-serif;letter-spacing:.544px;background-color:#ffffff;box-sizing:border-box !important;overflow-wrap:break-word !important'><p style="min-height:1em;letter-spacing:.544px;text-align:center;box-sizing:border-box !important;overflow-wrap:break-word !important"><span style="color:#7f7f7f;font-size:14px;letter-spacing:.544px;box-sizing:border-box !important;overflow-wrap:break-word !important">技术文章第一时间送达！</span></p></section><figure style=font-size:inherit;color:inherit;line-height:inherit><img data-ratio=0.4255555555555556 data-src="https://mmbiz.qpic.cn/mmbiz_png/dCCj1byj80uk6yVpKe1vhyMGKf3Vw53WrMfibmcYWQNPOa2ufntPEGwrDhiaaEwpAyDo0aTiaonz9zQRXKJCAXCEQ/640?wx_fmt=png" data-type=png data-w=900 style="font-size:inherit;color:inherit;line-height:inherit;display:block;margin-right:auto;margin-left:auto;width:677px !important;height:auto !important;visibility:visible !important" title="Java面试集锦：25道线程类相关面试题与答案（一） (2).png" _width=677px src= crossorigin=anonymous data-fail=0><figcaption style=line-height:inherit;margin-top:10px;text-align:center;color:#999999;font-size:.7em>Java面试集锦：25道线程类相关面试题与答案（一） (2).png</figcaption><br></figure><h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">1. 线程是什么？进程是什么？二者有什么区别和联系？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>（1）线程是CPU独立运行和独立调度的基本单位；<br>（2）进程是资源分配的基本单位；是执行着的应用程序<br>两者的联系：进程和线程都是操作系统所运行的程序运行的基本单元。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><strong style=font-size:inherit;line-height:inherit;color:#e96900>区别：</strong><br>（1）进程具有独立的空间地址，一个进程崩溃后，在保护模式下不会对其它进程产生影响。<br>（2）线程只是一个进程的不同执行路径，线程有自己的堆栈和局部变量，但线程之间没有单独的地址空间，一个线程死掉就等于整个进程死掉。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>进程是执行着的应用程序，而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">2. 线程和进程各自有什么区别和优劣呢？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>进程是资源分配的最小单位，线程是程序执行的最小单位。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>进程有自己的独立地址空间，每启动一个进程，系统就会为它分配地址空间，建立数据表来维护代码段、堆栈段和数据段，这种操作非常昂贵。而线程是共享进程中的数据的，使用相同的地址空间，因此CPU切换一个线程的花费远比进程要小很多，同时创建一个线程的开销也比进程要小很多。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>线程之间的通信更方便，同一进程下的线程共享全局变量、静态变量等数据，而进程之间的通信需要以通信的方式（IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>但是多进程程序更健壮，多线程程序只要有一个线程死掉，整个进程也死掉了，而一个进程死掉并不会对另外一个进程造成影响，因为进程有自己独立的地址空间。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>可参考文章[]()<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">3. 创建线程有几种不同的方式？你喜欢哪一种？为什么？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>有三种方式可以用来创建线程：<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>继承<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">Thread</code>类<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>实现<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">Runnable</code>接口<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>应用程序可以使用Executor框架来创建线程池<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>实现<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">Runnable接口</code>这种方式更受欢迎，因为这不需要继承<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">Thread</code>类。在应用设计中已经继承了别的对象的情况下，这需要多继承（而Java不支持多继承），只能实现接口。同时，线程池也是非常高效的，很容易实现和使用。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">4. 概括的解释下线程的几种可用状态?</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>线程在执行过程中，可以处于下面几种状态：<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><strong style=font-size:inherit;line-height:inherit;color:#e96900>就绪(Runnable)</strong>:线程准备运行，不一定立马就能开始执行。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><strong style=font-size:inherit;line-height:inherit;color:#e96900>运行中(Running)</strong>：进程正在执行线程的代码。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><strong style=font-size:inherit;line-height:inherit;color:#e96900>等待中(Waiting)</strong>:线程处于阻塞的状态，等待外部的处理结束。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><strong style=font-size:inherit;line-height:inherit;color:#e96900>睡眠中(Sleeping)</strong>：线程被强制睡眠。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><strong style=font-size:inherit;line-height:inherit;color:#e96900>I/O阻塞(Blocked on I/O)</strong>：等待I/O操作完成。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><strong style=font-size:inherit;line-height:inherit;color:#e96900>同步阻塞(Blocked on Synchronization)</strong>：等待获取锁。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><strong style=font-size:inherit;line-height:inherit;color:#e96900>死亡(Dead)</strong>：线程完成了执行。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">5. 同步方法和同步代码块的区别是什么？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>在Java语言中，每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>Java语言的关键字，当它用来修饰一个方法或者一个代码块的时候，能够保证在同一时刻最多只有一个线程执行该段代码。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>（1）、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时，一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>（2）、然而，当一个线程访问object的一个synchronized(this)同步代码块时，另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>（3）、尤其关键的是，当一个线程访问object的一个synchronized(this)同步代码块时，其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>（4）、第三个例子同样适用其它同步代码块。也就是说，当一个线程访问object的一个synchronized(this)同步代码块时，它就获得了这个object的对象锁。结果，其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>（5）、以上规则对其它对象锁同样适用。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">6. 在监视器(Monitor)内部，是如何做线程同步的？程序应该做哪种级别的同步？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块，确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">7. 什么是死锁(deadlock)？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">8. 如何确保N个线程可以访问N个资源同时又不导致死锁？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>使用多线程的时候，一种非常简单的避免死锁的方式就是：指定获取锁的顺序，并强制线程按照指定的顺序获取锁。因此，如果所有的线程都是以同样的顺序加锁和释放锁，就不会出现死锁了。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">9. 如何避免死锁?</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>多线程产生死锁的四个必要条件：<br><strong style=font-size:inherit;line-height:inherit;color:#e96900>互斥条件：</strong> 一个资源每次只能被一个进程使用。<br><strong style=font-size:inherit;line-height:inherit;color:#e96900>保持和请求条件：</strong> 一个进程因请求资源而阻塞时，对已获得资源保持不放。<br><strong style=font-size:inherit;line-height:inherit;color:#e96900>不可剥夺调教：</strong> 进程已获得资源，在未使用完成前，不能被剥夺。<br><strong style=font-size:inherit;line-height:inherit;color:#e96900>循环等待条件：</strong> 若干进程之间形成一种头尾相接的循环等待资源关系。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>只要破坏其中任意一个条件，就可以避免死锁，其中最简单的就是破环循环等待条件。按同一顺序访问对象，加载锁，释放锁。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">10. Thread 类中的start() 和 run() 方法有什么区别？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>start()方法被用来启动新创建的线程，使该被创建的线程状态变为可运行状态。当你调用run()方法的时候，只会是在原来的线程中调用，没有新的线程启动，start()方法才会启动新线程。如果我们调用了Thread的run()方法，它的行为就会和普通的方法一样，直接运行run（）方法。为了在新的线程中执行我们的代码，必须使用Thread.start()方法。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">11. Java中Runnable和Callable有什么不同？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1.0开始就有了，Callable是在JDK1.5增加的。它们的主要区别是Callable的 call() 方法可以返回值和抛出异常，而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">12. Java中什么是竞态条件？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>在大多数实际的多线程应用中，两个或两个以上的线程需要共享对同一数据的存取。如果i线程存取相同的对象，并且每一个线程都调用了一个修改该对象状态的方法，将会发生什么呢？可以想象，线程彼此踩了对方的脚。根据线程访问数据的次序，可能会产生讹误的对象。这样的情况通常称为竞争条件。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">13. Java中如何停止一个线程？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">Java</code>提供了很丰富的API但没有为停止线程提供API。<br><code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">JDK 1.0</code>本来有一些像<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">stop()</code>, <code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">suspend()</code> 和 <code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">resume()</code>的控制方法，但是由于潜在的死锁威胁。<br>因此在后续的JDK版本中他们被弃用了，之后Java API的设计者就没有提供一个兼容且线程安全的方法来停止一个线程。<br>当<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">run()</code>或者 <code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">call()</code> 方法执行完的时候线程会自动结束，如果要手动结束一个线程，可以用<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">volatile</code> 布尔变量来退出<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">run()</code>方法的循环或者是取消任务来中断线程。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">14. Java中notify 和 notifyAll有什么区别？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的，每个对象都有锁，通过线程获得。<br>如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中，线程正在等待的是哪个锁就不明显了。简单的说，由于wait，notify和notifyAll都是锁级别的操作，所以把他们定义在Object类中因为锁属于对象。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">15. Java中的同步集合与并发集合有什么区别？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合，不过并发集合的可扩展性更高。<br>在<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">Java1.5</code>之前程序员们只有同步集合来用且在多线程并发的时候会导致争用，阻碍了系统的扩展性。Java5介绍了并发集合像<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">ConcurrentHashMap</code>，不仅提供线程安全还用锁分离和内部分区等现代技术提高了可扩展性。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">16. 什么是线程池？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>线程池是一种多线程处理形式，处理过程中将任务提交到线程池，任务的执行交由线程池来管理。<br>如果每个请求都创建一个线程去处理，那么服务器的资源很快就会被耗尽，使用线程池可以减少创建和销毁线程的次数，每个工作线程都可以被重复利用，可执行多个任务。<h2 style=color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;font-size:1.4em><span style=font-size:inherit;color:inherit;line-height:inherit>17. 为什么要使用线程池？</span></h2><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>创建线程和销毁线程的花销是比较大的，这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程，再加上业务工作线程，消耗系统资源的时间，可能导致系统资源不足。（我们可以把创建和销毁的线程的过程去掉）<h2 style=color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;font-size:1.4em><span style=font-size:inherit;color:inherit;line-height:inherit>18. 线程池有什么作用？</span></h2><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>线程池作用就是限制系统中执行线程的数量。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>1、提高效率 创建好一定数量的线程放在池中，等需要使用的时候就从池中拿一个，这要比需要的时候创建一个线程对象要快的多。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>2、方便管理 可以编写线程池管理代码对池中的线程同一进行管理，比如说启动时有该程序创建100个线程，每当有请求的时候，就分配一个线程去工作，如果刚好并发有101个请求，那多出的这一个请求可以排队等候，避免因无休止的创建线程导致系统崩溃。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">19. 说说几种常见的线程池及使用场景?</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>1、<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">newSingleThreadExecutor</code>创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>2、<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">newFixedThreadPool</code>创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>3、<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">newCachedThreadPool</code>创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>4、<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">newScheduledThreadPool</code>创建一个定长线程池，支持定时及周期性任务执行。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">20. 线程池中的几种重要的参数?</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">corePoolSize</code>就是线程池中的核心线程数量，这几个核心线程，只是在没有用的时候，也不会被回收<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">maximumPoolSize</code>就是线程池中可以容纳的最大线程的数量<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">keepAliveTime</code>，就是线程池中除了核心线程之外的其他的最长可以保留的时间，因为在线程池中，除了核心线程即使在无任务的情况下也不能被清除，其余的都是有存活时间的，意思就是非核心线程可以保留的最长的空闲时间。<br><code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">util</code>，就是计算这个时间的一个单位。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">workQueue</code>，就是等待队列，任务可以储存在任务队列中等待被执行，执行的是FIFIO原则（先进先出）。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">threadFactory</code>，就是创建线程的线程工厂。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em><code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">handler</code>,是一种拒绝策略，我们可以在任务满了之后，拒绝执行某些任务。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">21. 说说线程池的拒绝策略?</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>当请求任务不断的过来，而系统此时又处理不过来的时候，我们需要采取的策略是拒绝服务。RejectedExecutionHandler接口提供了拒绝任务处理的自定义方法的机会。在ThreadPoolExecutor中已经包含四种处理策略。<ul class=list-paddingleft-2><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>AbortPolicy策略：该策略会直接抛出异常，阻止系统正常工作。</p><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>CallerRunsPolicy 策略：只要线程池未关闭，该策略直接在调用者线程中，运行当前的被丢弃的任务。</p><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>DiscardOleddestPolicy策略：该策略将丢弃最老的一个请求，也就是即将被执行的任务，并尝试再次提交当前任务。</p><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>DiscardPolicy策略：该策略默默的丢弃无法处理的任务，不予任何处理。</p></ul><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>除了JDK默认提供的四种拒绝策略，我们可以根据自己的业务需求去自定义拒绝策略，自定义的方式很简单，直接实现<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">RejectedExecutionHandler</code>接口即可。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">22. execute和submit的区别？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>我们执行任务是用的execute方法，除了execute方法，还有一个submit方法也可以执行我们提交的任务。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>这两个方法有什么区别呢？分别适用于在什么场景下呢？<br>我们来做一个简单的分析。<ul class=list-paddingleft-2><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>execute适用于不需要关注返回值的场景，只需要将线程丢到线程池中去执行就可以了。</p><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>submit方法适用于需要关注返回值的场景</p></ul><h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">23. 五种线程池的使用场景?</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><ul class=list-paddingleft-2><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>newSingleThreadExecutor：一个单线程的线程池，可以用于需要保证顺序执行的场景，并且只有一个线程在执行。</p><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>newFixedThreadPool：一个固定大小的线程池，可以用于已知并发压力的情况下，对线程数做限制。</p><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>newCachedThreadPool：一个可以无限扩大的线程池，比较适合处理执行时间比较小的任务。</p><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>newScheduledThreadPool：可以延时启动，定时启动的线程池，适用于需要多个后台线程执行周期任务的场景。</p><li><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>newWorkStealingPool：一个拥有多个任务队列的线程池，可以减少连接数，创建当前可用cpu数量的线程来并行执行。</p></ul><h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">24. 线程池如何关闭? 初始化线程池时线程数的选择？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>关闭线程池可以调用shutdownNow和shutdown两个方法来实现<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>shutdownNow：对正在执行的任务全部发出interrupt()，停止执行，对还未开始执行的任务全部取消，并且返回还没开始的任务列表。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>shutdown：当我们调用shutdown后，线程池将不再接受新的任务，但也不会去强制终止已经提交或者正在执行中的任务。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>如果任务是IO密集型，一般线程数需要设置2倍CPU数以上，以此来尽量利用CPU资源。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>如果任务是CPU密集型，一般线程数量只需要设置CPU数加1即可，更多的线程数也只能增加上下文切换，不能增加CPU利用率。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>上述只是一个基本思想，如果真的需要精确的控制，还是需要上线以后观察线程池中线程数量跟队列的情况来定。<h3 style="color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;border-bottom:2px solid #ef7060;font-size:1.3em"><span style="font-size:inherit;line-height:inherit;display:inline-block;font-weight:normal;background:#ef7060;color:#ffffff;padding:3px 10px 1px;border-top-right-radius:3px;border-top-left-radius:3px;margin-right:3px">25. 线程池都有哪几种工作队列？</span><span style="display:inline-block;vertical-align:bottom;border-bottom:36px solid #efebe9;border-right:20px solid transparent"> </span></h3><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>1、<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">ArrayBlockingQueue</code><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>是一个基于数组结构的有界阻塞队列，此队列按 FIFO（先进先出）原则对元素进行排序。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>2、<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">LinkedBlockingQueue</code><br>一个基于链表结构的阻塞队列，此队列按FIFO （先进先出） 排序元素，吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>3、<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">SynchronousQueue</code><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作，否则插入操作一直处于阻塞状态，吞吐量通常要高于LinkedBlockingQueue，静态工厂方法Executors.newCachedThreadPool使用了这个队列。<p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>4、<code style="font-size:inherit;line-height:inherit;padding:2px 4px;border-radius:4px;margin-right:2px;margin-left:2px;color:#f82375;background:#f8f8f8">PriorityBlockingQueue</code><p style=font-size:inherit;color:inherit;line-height:inherit;margin-top:1.7em;margin-bottom:1.7em>一个具有优先级的无限阻塞队列。<h2 style=color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;font-size:1.4em><span style=font-size:inherit;color:inherit;line-height:inherit>推荐</span></h2><p><span style=font-size:inherit;color:inherit;line-height:inherit><span style='color:#3e3e3e;font-family:"Helvetica Neue",Helvetica,"Hiragino Sans GB","Microsoft YaHei",Arial,sans-serif;font-size:15px;letter-spacing:2px;word-spacing:2px;background-color:#ffffff'>https://www.processon.com/i/5cd53c2fe4b01941c8cf1c21(ProcessOn是一个在线作图工具的聚合平台~)</span></span><h2 style=color:inherit;line-height:inherit;margin-top:1.6em;margin-bottom:1.6em;font-weight:bold;font-size:1.4em><span style=font-size:inherit;color:inherit;line-height:inherit>文末</span></h2><blockquote style="line-height:inherit;padding:15px 15px 15px 1rem;font-size:.9em;color:#000000;border-left-width:5px;border-left-color:#ef7060;background:#efebe9;overflow:auto;word-break:normal"><p style=font-size:inherit;color:inherit;line-height:inherit>欢迎关注个人微信公众号：<strong style=font-size:inherit;line-height:inherit;color:#e96900>Coder编程</strong><br>欢迎关注<strong style=font-size:inherit;line-height:inherit;color:#e96900>Coder编程</strong>公众号，主要分享数据结构与算法、Java相关知识体系、框架知识及原理、Spring全家桶、微服务项目实战、DevOps实践之路、每日一篇互联网大厂面试或笔试题以及PMP项目管理知识等。更多精彩内容正在路上~<br>新建了一个qq群：315211365，欢迎大家进群交流一起学习。谢谢了！也可以介绍给身边有需要的朋友。<p style=font-size:inherit;color:inherit;line-height:inherit>文章收录至<br>Github: https://github.com/CoderMerlin/coder-programming<br>Gitee: https://gitee.com/573059382/coder-programming<br>欢迎<strong style=font-size:inherit;line-height:inherit;color:#e96900>关注</strong>并star~<br><figure style=font-size:inherit;color:inherit;line-height:inherit><img data-ratio=1 data-src="https://mmbiz.qpic.cn/mmbiz_jpg/dCCj1byj80uk6yVpKe1vhyMGKf3Vw53WkyY0mtlc1lHYiaZzsmR9vqaPTxfr8sMxibWh9WDyibzP5r9b6WqUdpVdA/640?wx_fmt=jpeg" data-type=jpeg data-w=287 style="font-size:inherit;color:inherit;line-height:inherit;display:block;margin-right:auto;margin-left:auto;width:287px !important;height:auto !important;visibility:visible !important" title=微信公众号 _width=287px src= crossorigin=anonymous data-fail=0><figcaption style=line-height:inherit;margin-top:10px;text-align:center;color:#999999;font-size:.7em>微信公众号</figcaption></figure></blockquote></section><p><br></p>
 </div>
 
 
 <div class=ct_mpda_wrp id=js_sponsor_ad_area style=display:none></div>
 
 <div class=read-more__area id=js_more_read_area style=display:none>
 
 </div>
 </div>
 
 
 
 <ul id=js_hotspot_area class=article_extend_area></ul>
 
 
<div class=rich_media_tool id=js_toobar3>
 <div class=weui-flex>
 <div class=weui-flex__item>
 
 <div id=js_read_area3 class="media_tool_meta tips_global_primary meta_primary" style=display:none>
 <span id=readTxt>阅读</span>
 <span id=readNum3></span>
 </div>
 </div>
 <span style=display:none class="media_tool_meta meta_extra meta_praise" id=like_old>
 <i class=icon_praise_gray></i><span class=praise_num id=likeNum_old></span>
 </span>
 
 <span style=visibility:hidden class="media_tool_meta meta_extra meta_like" id=like3>
 <button class=like_btn id=js_like_btn> 
 <span id=js_like_wording> 在看</span><span class=like_num id=likeNum3></span>
 </button>
 </span>
 
 </div>
</div>
 
 <div class=like_comment_wrp id=js_like_comment style=display:none>
 <div class=like_comment_inner>
 
 
 </div>
 </div> 
 <div style=display:none id=wow_close_inform>
 <div class=weui-mask></div>
 <div class=weui-dialog>
 
 
 
 </div>
 </div>
<div id=js_like_toast style=display:none>
 <div class=weui-mask_transparent></div>
 <div class=weui-toast>
 
 
 </div>
</div>
<div style=display:none id=js_comment_panel>
 <div class="like_comment_primary_wrp editing" id=js_comment_wrp>
 
 </div> 
 <div class=like_comment_primary_mask id=js_mask_2></div>
</div>
<div id=js_loading style=display:none>
 <div class=weui-mask_transparent></div>
 <div class=weui-toast>
 
 
 </div>
</div>
 </div>
 </div>
 <div class="rich_media_area_primary sougou" id=sg_tj style=display:none></div>
 
 <div class=rich_media_area_extra>
 <div class=rich_media_area_extra_inner>
 
 <div id=js_share_appmsg>
 </div>
 
 
 <div class=mpda_bottom_container id=js_bottom_ad_area style=display:none></div>
 
 <div id=js_iframetest style=display:none></div>
 
 <div class="rich_media_extra rich_media_extra_discuss" id=js_cmt_container style=display:none>
 
 
 <div class=discuss_mod id=js_friend_cmt_area style=display:none>
 
 
 
 </div>
 <div class=discuss_mod id=js_cmt_area style=display:none>
 </div>
 </div>
 </div>
 </div>
 
 <div id=js_pc_qr_code class=qr_code_pc_outer style=display:block;>
 <div class=qr_code_pc_inner>
 <div class=qr_code_pc>
 <img id=js_pc_qr_code_img class=qr_code_pc_img src="">
 <p>微信扫一扫<br>关注该公众号</p>
 </div>
 </div>
 </div>
 </div>
</div>
<div id=js_pc_weapp_code class="weui-desktop-popover weui-desktop-popover_pos-up-center weui-desktop-popover_img-text" style=display:none>
 <div class=weui-desktop-popover__content>
 
 </div>
</div>
<div id=js_minipro_dialog style=display:none>
 <div class=weui-mask></div>
 <div class="weui-dialog weui-dialog_link">
 
 
 
 
 </div>
</div>
<div id=js_link_dialog style=display:none>
 <div class=weui-mask></div>
 <div class="weui-dialog weui-dialog_link">
 
 
 
 
 </div>
</div>
<div class=comment_primary_emotion_panel_wrp id=js_emotion_panel_pc style=display:none>
 <div class=comment_primary_emotion_panel>
 
 </div>
</div>
<div class=weui-dialog__wrp id=js_alert_panel style=display:none>
 <div class=weui-mask></div>
 <div class=weui-dialog>
 
 
 </div>
</div>
<div id=js_weapp_without_auth_dialog style=display:none>
 <div class=weui-mask></div>
 <div class="weui-dialog weui-dialog_link">
 
 
 </div>
</div>
 
 
 
 
 
 
